<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow-IPC: transport/sync_io/detail/native_socket_stream_impl_rcv.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow-IPC<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow-IPC project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_0c017496b493ff066fbbe686970307ba.html">transport</a></li><li class="navelem"><a class="el" href="dir_00580eb0cf40d799755587f5d56ed1cf.html">sync_io</a></li><li class="navelem"><a class="el" href="dir_51213d4cdf375ab846ee07ea55bdba59.html">detail</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">native_socket_stream_impl_rcv.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="native__socket__stream__impl__rcv_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow-IPC: Core</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#include &quot;<a class="code" href="sync__io_2detail_2native__socket__stream__impl_8hpp.html">ipc/transport/sync_io/detail/native_socket_stream_impl.hpp</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="preprocessor">#include &quot;<a class="code" href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">ipc/transport/error.hpp</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span> </div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceipc_1_1transport_1_1sync__io.html">ipc::transport::sync_io</a></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span>{</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="comment">// Native_socket_stream::Impl implementations (::rcv_*() and receive-API methods only).</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4a94088b9f00288ae7e2cf3c7b49c444">   27</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4a94088b9f00288ae7e2cf3c7b49c444">Native_socket_stream::Impl::start_receive_native_handle_ops</a>(<a class="code hl_typedef" href="namespaceipc_1_1util_1_1sync__io.html#aa0b9a3cc6bdc7dedbef4f9e06851aa24">util::sync_io::Event_wait_func</a>&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span>{</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span>  <span class="keywordflow">return</span> start_ops&lt;Op::S_RCV&gt;(std::move(ev_wait_func));</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span>}</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a12e99a2479fbf08b2fa32a2f17ed1ca7">   32</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a12e99a2479fbf08b2fa32a2f17ed1ca7">Native_socket_stream::Impl::start_receive_blob_ops</a>(<a class="code hl_typedef" href="namespaceipc_1_1util_1_1sync__io.html#aa0b9a3cc6bdc7dedbef4f9e06851aa24">util::sync_io::Event_wait_func</a>&amp;&amp; ev_wait_func)</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span>{</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span>  <span class="keywordflow">return</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#ac6d65bc2852ad8800cb57a23311fbe7e">start_receive_native_handle_ops</a>(std::move(ev_wait_func));</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span>}</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span> </div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa3b06f1d59f5635c81a99e4ae8f7b8c7">   37</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa3b06f1d59f5635c81a99e4ae8f7b8c7">Native_socket_stream::Impl::async_receive_native_handle</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>* target_hndl,</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span>                                                             <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>&amp; target_meta_blob,</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span>                                                             <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz,</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span>                                                             flow::async::Task_asio_err_sz&amp;&amp; on_done_func)</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno">   41</span>{</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>  <span class="comment">/* Subtlety: async_receive_blob() will pass target_hndl==nullptr to _impl(); but we do not allow this.</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span><span class="comment">   * When using us as a Native_handle_receiver they must be ready to receive a Native_handle, even if the other</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span><span class="comment">   * side chooses to not send one (then *target_hndl shall be set to equal Native_handle(), a null handle).</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment">   *</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment">   * So now internally our code can tell whether this is from a Blob_receiver or a Native_handle_receiver role</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span><span class="comment">   * and emit error::Code::S_BLOB_RECEIVER_GOT_NON_BLOB if target_hndl==0, yet the other side sent an actual handle. */</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>  assert(target_hndl &amp;&amp; <span class="stringliteral">&quot;Native_socket_stream::async_receive_native_handle() must take non-null Native_handle ptr.&quot;</span>);</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>  <span class="keywordflow">return</span> async_receive_native_handle_impl(target_hndl, target_meta_blob, sync_err_code, sync_sz,</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>                                          std::move(on_done_func));</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>}</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span> </div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4c3d1ba7c70649898a7893daf076c7ae">   54</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4c3d1ba7c70649898a7893daf076c7ae">Native_socket_stream::Impl::async_receive_blob</a>(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>&amp; target_blob,</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>                                                    <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz,</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>                                                    flow::async::Task_asio_err_sz&amp;&amp; on_done_func)</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>{</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>  <span class="keywordflow">return</span> async_receive_native_handle_impl(<span class="keyword">nullptr</span>, target_blob, sync_err_code, sync_sz, std::move(on_done_func));</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span>}</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ae16d560bf3c4eccfa975d47af71cb145">   61</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ae16d560bf3c4eccfa975d47af71cb145">Native_socket_stream::Impl::async_receive_native_handle_impl</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>* target_hndl_or_null,</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>                                                                  <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>&amp; target_meta_blob,</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>                                                                  <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code_ptr, <span class="keywordtype">size_t</span>* sync_sz,</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>                                                                  flow::async::Task_asio_err_sz&amp;&amp; on_done_func)</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span>{</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>  <span class="keywordflow">if</span> ((!op_started&lt;Op::S_RCV&gt;(<span class="stringliteral">&quot;async_receive_native_handle()&quot;</span>)) || (!state_peer(<span class="stringliteral">&quot;async_receive_native_handle()&quot;</span>)))</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>  {</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>  }</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span> </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span>  <span class="comment">/* We comment liberally, but tactically, inline; but please read the strategy in the class doc header&#39;s impl section.</span></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span><span class="comment">   *</span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span><span class="comment">   * Briefly though: If you understand send_native_handle() impl, then this will be easy in comparison:</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span><span class="comment">   * no more than one async_receive_native_handle_impl() can be outstanding at a time; they are not allowed to</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span><span class="comment">   * invoke it until we invoke their completion handler.  (Rationale is shown in detail elsewhere.)</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span><span class="comment">   * So there is no queuing of requests (deficit); nor reading more messages beyond what has been requested</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno">   80</span><span class="comment">   * (surplus).</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span><span class="comment">   *</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span><span class="comment">   * That said, we must inform them of completion via on_done_func(), whereas send_native_handle() has no</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span><span class="comment">   * such requirement; easy enough -- we just save it as needed.  In that sense it is much like</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span><span class="comment">   * async_end_sending().</span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span><span class="comment">   *</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span><span class="comment">   * ...No, it&#39;s not easy in comparison actually.  Sure, there is no queuing of requests, but the outgoing-direction</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span><span class="comment">   * algorithm makes the low-level payloads and then just sends them out -- what&#39;s inside doesn&#39;t matter.</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span><span class="comment">   * Incoming-direction is harder, because we need to read payload 1, interpret it, possibly read payload 2.</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span><span class="comment">   * So there is a bunch of tactical nonsense about async-waiting and then resuming from the same spot and so on. */</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span> </div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>  <span class="keywordflow">if</span> (m_rcv_user_request)</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>  {</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Async-receive requested, but the preceding such request &quot;</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>                     <span class="stringliteral">&quot;is still in progress; the message has not arrived yet.  &quot;</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>                     <span class="stringliteral">&quot;Likely a user error, but who are we to judge?  Ignoring.&quot;</span>);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>  }</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>  <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> sync_err_code;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User async-receive request for &quot;</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>                 <span class="stringliteral">&quot;possible native handle and meta-blob (located @ [&quot;</span> &lt;&lt; target_meta_blob.data() &lt;&lt; <span class="stringliteral">&quot;] of &quot;</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>                 <span class="stringliteral">&quot;max size [&quot;</span> &lt;&lt; target_meta_blob.size() &lt;&lt; <span class="stringliteral">&quot;]).&quot;</span>);</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span> </div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>  <span class="keywordflow">if</span> (m_rcv_pending_err_code)</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>  {</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User async-receive request for &quot;</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>                     <span class="stringliteral">&quot;possible native handle and meta-blob (located @ [&quot;</span> &lt;&lt; target_meta_blob.data() &lt;&lt; <span class="stringliteral">&quot;] of &quot;</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>                     <span class="stringliteral">&quot;max size [&quot;</span> &lt;&lt; target_meta_blob.size() &lt;&lt; <span class="stringliteral">&quot;]): Error already encountered earlier.  Emitting &quot;</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>                     <span class="stringliteral">&quot;via sync-args.&quot;</span>);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span> </div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>    sync_err_code = m_rcv_pending_err_code;</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>    *sync_sz = 0;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>  }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>  <span class="keywordflow">else</span> <span class="comment">// if (!m_rcv_pending_err_code)</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>  {</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>    <span class="comment">// Background can be found by following the comment on this concept constant.</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span>    <span class="keyword">static_assert</span>(<a class="code hl_variable" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#a7034a92ae66759080c035b36ff851e0c">Native_socket_stream::S_BLOB_UNDERFLOW_ALLOWED</a>,</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span>                  <span class="stringliteral">&quot;Socket streams allow trying to receive into a buffer that could underflow &quot;</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span>                    <span class="stringliteral">&quot;with the largest *possible* message -- as long as the actual message &quot;</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span>                    <span class="stringliteral">&quot;(if any) happens to be small enough to fit.  Otherwise a pipe-hosing &quot;</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>                    <span class="stringliteral">&quot;error shall occur at receipt time.&quot;</span>);</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span> </div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>    m_rcv_user_request.emplace();</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>    m_rcv_user_request-&gt;m_target_hndl_ptr = target_hndl_or_null;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>    m_rcv_user_request-&gt;m_target_meta_blob = target_meta_blob;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>    m_rcv_user_request-&gt;m_on_done_func = std::move(on_done_func);</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span> </div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>    rcv_read_msg(&amp;sync_err_code, sync_sz);</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>  } <span class="comment">// else if (!m_rcv_pending_err_code)</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span> </div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>  <span class="keywordflow">if</span> ((!sync_err_code) || (sync_err_code != <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>))</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>  {</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Async-request completed synchronously (result &quot;</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>                    <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; sync_err_code &lt;&lt; <span class="stringliteral">&quot;] [&quot;</span> &lt;&lt; sync_err_code.message() &lt;&lt; <span class="stringliteral">&quot;]); emitting synchronously and &quot;</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>                    <span class="stringliteral">&quot;disregarding handler.&quot;</span>);</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>    m_rcv_user_request.reset(); <span class="comment">// No-op if we didn&#39;t set it up due to m_rcv_pending_err_code being truthy already.</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span>  }</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span>  <span class="comment">// else { Other stuff logged enough. }</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span>  <span class="comment">// Standard error-reporting semantics.</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span>  <span class="keywordflow">if</span> ((!sync_err_code_ptr) &amp;&amp; sync_err_code)</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>  {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span>    <span class="keywordflow">throw</span> flow::error::Runtime_error(sync_err_code, <span class="stringliteral">&quot;Native_socket_stream::Impl::async_receive_native_handle_impl()&quot;</span>);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno">  146</span>  }</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>  sync_err_code_ptr &amp;&amp; (*sync_err_code_ptr = sync_err_code);</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>  <span class="comment">// And if (!sync_err_code_ptr) + no error =&gt; no throw.</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span> </div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno">  152</span>} <span class="comment">// Native_socket_stream::Impl::async_receive_native_handle_impl()</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#abedd0db5a5ae04e47085728ae548d07c">  154</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#abedd0db5a5ae04e47085728ae548d07c">Native_socket_stream::Impl::idle_timer_run</a>(<a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a> timeout)</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>{</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a31e67d3a017477a04b313927e2f2c733">util::Task</a>;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>  <span class="keyword">using </span>boost::chrono::round;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span>  <span class="keyword">using </span>boost::chrono::milliseconds;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno">  160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>  <span class="comment">// We comment liberally, but tactically, inline; but please read the strategy in the class doc header&#39;s impl section.</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>  assert(timeout.count() &gt; 0);</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span>  <span class="keywordflow">if</span> ((!op_started&lt;Op::S_RCV&gt;(<span class="stringliteral">&quot;idle_timer_run()&quot;</span>)) || (!state_peer(<span class="stringliteral">&quot;idle_timer_run()&quot;</span>)))</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>  {</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span>  }</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span> </div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>  <span class="comment">// According to concept requirements we shall no-op/return false if duplicately called.</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>  <span class="keywordflow">if</span> (m_rcv_idle_timeout != Fine_duration::zero())</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>  {</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User wants to start idle timer, but they have already &quot;</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>                     <span class="stringliteral">&quot;started it before.  Therefore ignoring.&quot;</span>);</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>    <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>  }</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span> </div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span>  m_rcv_idle_timeout = timeout; <span class="comment">// Remember this, both as flag (non-zero()) and to know to when to schedule it.</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>  <span class="comment">// Now we will definitely return true (even if an error is already pending).  This matches concept requirements.</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span> </div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span>  <span class="keywordflow">if</span> (m_rcv_pending_err_code)</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno">  184</span>  {</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User wants to start idle timer, but an error has already &quot;</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span>                  <span class="stringliteral">&quot;been found and emitted earlier.  It&#39;s moot; ignoring.&quot;</span>);</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span>    <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>  }</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span> </div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>  FLOW_LOG_INFO(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User wants to start idle-timer with timeout &quot;</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>                <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; round&lt;milliseconds&gt;(m_rcv_idle_timeout) &lt;&lt; <span class="stringliteral">&quot;].  Scheduling (will be rescheduled as needed).&quot;</span>);</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span> </div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span>  <span class="comment">/* Per requirements in concept, start it now; reschedule similarly each time there is activity.</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span><span class="comment">   *</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span><span class="comment">   * The mechanics of timer-scheduling are identical to those in auto_ping() and are explained there;</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span><span class="comment">   * keeping comments light here. */</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>  m_rcv_ev_wait_func(&amp;m_rcv_ev_wait_hndl_idle_timer_fired_peer,</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>                     <span class="keyword">false</span>, <span class="comment">// Wait for read.</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>                     boost::make_shared&lt;Task&gt;</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>                       ([<span class="keyword">this</span>]() { rcv_on_ev_idle_timer_fired(); }));</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span>  m_rcv_idle_timer.expires_after(m_rcv_idle_timeout);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span>  m_timer_worker.timer_async_wait(&amp;m_rcv_idle_timer, m_rcv_idle_timer_fired_peer);</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span> </div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span>} <span class="comment">// Native_socket_stream::Impl::idle_timer_run()</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span> </div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a53b356e756923271fbb9b7a7beb8f54a">  210</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a53b356e756923271fbb9b7a7beb8f54a">Native_socket_stream::Impl::rcv_on_ev_idle_timer_fired</a>()</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span>{</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span>  <span class="comment">/* This is an event handler!  Specifically for the *m_rcv_idle_timer_fired_peer pipe reader being</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment">   * readable.  To avoid infinite-loopiness, we&#39;d best pop the thing that was written there. */</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span>  m_timer_worker.consume_timer_firing_signal(m_rcv_idle_timer_fired_peer);</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span> </div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>  <span class="keywordflow">if</span> (m_rcv_pending_err_code)</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>  {</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Idle timer fired: There&#39;s been 0 traffic past idle timeout.  &quot;</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>                   <span class="stringliteral">&quot;However an error has already been found and emitted earlier.  Therefore ignoring.&quot;</span>);</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>  }</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span> </div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>  m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aba920b52e9801e4927dd346ad83ce815">error::Code::S_RECEIVER_IDLE_TIMEOUT</a>;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span> </div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>  FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Idle timer fired: There&#39;s been 0 traffic past idle timeout.  &quot;</span></div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>                   <span class="stringliteral">&quot;Will not proceed with any further low-level receiving.  If a user async-receive request is &quot;</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>                   <span class="stringliteral">&quot;pending (is it? = [&quot;</span> &lt;&lt; <span class="keywordtype">bool</span>(m_rcv_user_request) &lt;&lt; <span class="stringliteral">&quot;]) will emit to completion handler.&quot;</span>);</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span> </div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>  <span class="keywordflow">if</span> (m_rcv_user_request)</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>  {</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>    <span class="comment">// Prevent stepping on our own toes: move/clear it first / invoke handler second.</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>    <span class="keyword">const</span> <span class="keyword">auto</span> on_done_func = std::move(m_rcv_user_request-&gt;m_on_done_func);</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span>    m_rcv_user_request.reset();</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span>    on_done_func(m_rcv_pending_err_code, 0);</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Handler completed.&quot;</span>);</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>  }</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span> </div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>  <span class="comment">/* That&#39;s it.  If m_rcv_user_request (we&#39;ve just nullified it) then async read chain will be finished forever as</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span><span class="comment">   * soon as the user informs us of readability (if it ever does) -- we will detect there&#39;s an error</span></div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span><span class="comment">   * in m_rcv_pending_err_code already (and hence no m_rcv_user_request). */</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span>} <span class="comment">// Native_socket_stream::Impl::rcv_on_ev_idle_timer_fired()</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span> </div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#adff873e21beee6c31a552293d8b0004c">  244</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#adff873e21beee6c31a552293d8b0004c">Native_socket_stream::Impl::rcv_not_idle</a>()</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span>{</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">util::Fine_duration</a>;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span> </div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span>  <span class="keywordflow">if</span> (m_rcv_idle_timeout == Fine_duration::zero())</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span>  {</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span>  }</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span> </div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>  <span class="comment">/* idle_timer_run() has enabled the idle timer feature, and we&#39;ve been called indicating we just read something,</span></div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span><span class="comment">   * and therefore it is time to reschedule the idle timer. */</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span> </div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>  <span class="keyword">const</span> <span class="keyword">auto</span> n_canceled = m_rcv_idle_timer.expires_after(m_rcv_idle_timeout);</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span> </div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>  <span class="keywordflow">if</span> (n_canceled == 0)</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span>  {</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span>    <span class="comment">// This is a fun, rare coincidence that is worth an INFO message.</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>    FLOW_LOG_INFO(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Finished reading a message, which means &quot;</span></div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>                  <span class="stringliteral">&quot;we just received traffic, which means the idle timer should be rescheduled.  However &quot;</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>                  <span class="stringliteral">&quot;when trying to reschedule it, we found we were too late: it was very recently queued to &quot;</span></div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>                  <span class="stringliteral">&quot;be invoked in the near future.  An idle timeout error shall be emitted very soon.&quot;</span>);</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>  }</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>  <span class="keywordflow">else</span> <span class="comment">// if (n_canceled &gt;= 1)</span></div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>  {</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>    assert((n_canceled == 1) &amp;&amp; <span class="stringliteral">&quot;We only issue 1 timer async_wait() at a time.&quot;</span>);</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno">  271</span>    <span class="comment">/* m_timer_worker will m_rcv_idle_timer.async_wait(F), where F() will signal through pipe,</span></div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span><span class="comment">     * making *m_rcv_idle_timer_fired_peer readable.  We&#39;ve already used m_rcv_ev_wait_func() to start</span></div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span><span class="comment">     * wait on it being readable and invoke rcv_on_ev_idle_timer_fired() in that case; but we&#39;ve</span></div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span><span class="comment">     * canceled the previous .async_wait() that would make it readable; so just redo that part. */</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span>    m_timer_worker.timer_async_wait(&amp;m_rcv_idle_timer, m_rcv_idle_timer_fired_peer);</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span>  }</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span>} <span class="comment">// Native_socket_stream::Impl::rcv_not_idle()</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span> </div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa8c4ec6715dc5c437ed285cfea600b46">  279</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa8c4ec6715dc5c437ed285cfea600b46">Native_socket_stream::Impl::rcv_read_msg</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz)</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>{</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a31e67d3a017477a04b313927e2f2c733">util::Task</a>;</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>  <span class="keyword">using </span>flow::util::Lock_guard;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Async-receive: Start of payload 1: &quot;</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>                 <span class="stringliteral">&quot;Trying nb-read of payload 1 (handle if any, meta-blob-length) synchronously.&quot;</span>);</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>  assert(!m_rcv_pending_err_code);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span> </div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>  <a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> target_hndl; <span class="comment">// Target this even if target_hndl_or_null is null (to check for a certain error).</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>  <span class="keyword">const</span> <span class="keyword">auto</span> n_rcvd_or_zero</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>    = rcv_nb_read_low_lvl_payload(&amp;target_hndl,</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>                                  <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(&amp;m_rcv_target_meta_length, <span class="keyword">sizeof</span>(m_rcv_target_meta_length)),</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>                                  &amp;m_rcv_pending_err_code);</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>  <span class="keywordflow">if</span> (!m_rcv_pending_err_code)</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>  {</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>    <span class="keywordflow">if</span> (n_rcvd_or_zero != 0)</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>    {</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Got some or all of payload 1.&quot;</span>);</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>      rcv_on_handle_finalized(target_hndl, n_rcvd_or_zero, sync_err_code, sync_sz);</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>    }</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span> </div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Got nothing but would-block.  Awaiting readability.&quot;</span>);</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span> </div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>    <span class="comment">/* Conceptually we&#39;d like to do m_peer_socket-&gt;async_wait(readable, F), where F() would perform</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span><span class="comment">     * rcv_nb_read_low_lvl_payload() (nb-receive over m_peer_socket).  However this is the sync_io pattern, so</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span><span class="comment">     * the user will be performing the conceptual async_wait() for us.  We must ask them to do so</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span><span class="comment">     * via m_rcv_ev_wait_func(), giving them m_peer_socket&#39;s FD -- m_ev_wait_hndl_peer_socket -- to wait-on. */</span></div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span> </div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>    <span class="comment">// m_*peer_socket = (the only) shared data between our- and opposite-direction code.  Must lock (see their docs).</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>    {</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>      Lock_guard&lt;<span class="keyword">decltype</span>(m_peer_socket_mutex)&gt; peer_socket_lock(m_peer_socket_mutex);</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span> </div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>      <span class="keywordflow">if</span> (m_peer_socket)</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>      {</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>        m_rcv_ev_wait_func(&amp;m_ev_wait_hndl_peer_socket,</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>                           <span class="keyword">false</span>, <span class="comment">// Wait for read.</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>                           <span class="comment">// Once writable do this:</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>                           boost::make_shared&lt;Task&gt;([<span class="keyword">this</span>]()</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>        {</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>          rcv_on_ev_peer_socket_readable_or_error(Rcv_msg_state::S_MSG_START, 0 <span class="comment">/* ignored for S_MSG_START */</span>);</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>        }));</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span> </div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>        *sync_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>;</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>        *sync_sz = 0;</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>      }</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>      <span class="comment">// else:</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>    } <span class="comment">// Lock_guard peer_socket_lock(m_peer_socket_mutex)</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User async-receive request: &quot;</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>                     <span class="stringliteral">&quot;was about to await readability but discovered opposite-direction socket-hosing error; &quot;</span></div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>                     <span class="stringliteral">&quot;emitting error via completion handler (or via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span> </div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>    m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1">error::Code::S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</a>;</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>  } <span class="comment">// if (!m_rcv_pending_err_code) (but may have become truthy inside, and has unless we `return`ed inside)</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span> </div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>  assert(m_rcv_pending_err_code);</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span> </div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Nb-read, or async-read following nb-read encountering would-block, detected error (details &quot;</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>                 <span class="stringliteral">&quot;above); will emit via completion handler (or via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>  *sync_err_code = m_rcv_pending_err_code;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>  *sync_sz = 0;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>} <span class="comment">// Native_socket_stream::Impl::rcv_read_msg()</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa342b6f0c7e2015517a5c465e4963fc7">  348</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa342b6f0c7e2015517a5c465e4963fc7">Native_socket_stream::Impl::rcv_on_handle_finalized</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a> hndl_or_null, <span class="keywordtype">size_t</span> n_rcvd,</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>                                                         <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz)</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>{</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a31e67d3a017477a04b313927e2f2c733">util::Task</a>;</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>  <span class="keyword">using </span>flow::util::Lock_guard;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span> </div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>  assert(m_rcv_user_request);</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>  assert(!m_rcv_pending_err_code);</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>  assert(n_rcvd != 0);</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span> </div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> proto_negotiating</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>    = m_protocol_negotiator.negotiated_proto_ver() == <a class="code hl_variable" href="classipc_1_1transport_1_1Protocol__negotiator.html#aa7e47f4f6a700aeaa9600a5426a17292">Protocol_negotiator::S_VER_UNKNOWN</a>;</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span> </div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>  <span class="keywordflow">if</span> (proto_negotiating &amp;&amp; (!hndl_or_null.<a class="code hl_function" href="structipc_1_1util_1_1Native__handle.html#a11bd62ce0a7bef4bdfe666201c26d4dc">null</a>()))</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>  {</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Expecting protocol-negotiation (first) in-message &quot;</span></div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>                     <span class="stringliteral">&quot;to contain *only* a meta-blob: but received Native_handle is non-null which is &quot;</span></div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>                     <span class="stringliteral">&quot;unexpected; emitting error via completion handler (or via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>    m_protocol_negotiator.compute_negotiated_proto_ver(<a class="code hl_variable" href="classipc_1_1transport_1_1Protocol__negotiator.html#aa7e47f4f6a700aeaa9600a5426a17292">Protocol_negotiator::S_VER_UNKNOWN</a>, &amp;m_rcv_pending_err_code);</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Protocol_negotiator breaking contract?  Bug?&quot;</span>);</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>    assert(m_rcv_pending_err_code</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>           &amp;&amp; <span class="stringliteral">&quot;Protocol_negotiator should have emitted error given intentionally bad version.&quot;</span>);</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>  }</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((!hndl_or_null.<a class="code hl_function" href="structipc_1_1util_1_1Native__handle.html#a11bd62ce0a7bef4bdfe666201c26d4dc">null</a>()) &amp;&amp; (!m_rcv_user_request-&gt;m_target_hndl_ptr))</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>       <span class="comment">// &amp;&amp; (!proto_negotiating)</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>  {</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User async-receive request for &quot;</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>                     <span class="stringliteral">&quot;*only* a meta-blob: but received Native_handle is non-null which is &quot;</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>                     <span class="stringliteral">&quot;unexpected; emitting error via completion handler (or via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>    m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297ae3753569086cc66c6165480bd8d2f937">error::Code::S_BLOB_RECEIVER_GOT_NON_BLOB</a>;</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>  } <span class="comment">// if (hndl_or_null &amp;&amp; (!m_rcv_user_request-&gt;m_target_hndl_ptr))</span></div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>  <span class="keywordflow">else</span> <span class="comment">// if (no prob with hndl_or_null or m_target_hndl_ptr)</span></div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>  {</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>    <span class="comment">// Finalize the user&#39;s Native_handle target variable if applicable.</span></div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>    <span class="keywordflow">if</span> (m_rcv_user_request-&gt;m_target_hndl_ptr</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>        <span class="comment">// If proto_negotiating, hndl_or_null is null; and anyway m_target_hndl_ptr is not yet in play.</span></div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>        &amp;&amp; (!proto_negotiating))</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>    {</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>      *m_rcv_user_request-&gt;m_target_hndl_ptr = hndl_or_null;</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>    }</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span> </div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span>    <span class="keywordflow">if</span> (n_rcvd == <span class="keyword">sizeof</span>(m_rcv_target_meta_length))</div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>    {</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>      <span class="comment">// Got the entire payload 1, not just some of it including handle-if-any.</span></div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>      rcv_on_head_payload(sync_err_code, sync_sz);</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>    }</div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>    <span class="comment">// else</span></div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span> </div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>    <span class="comment">/* Still have to finish reading into m_rcv_target_meta_length.  We&#39;ve already hit would-block so,</span></div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span><span class="comment">     * much like in rcv_read_msg() (keeping comments light): */</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span> </div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>    {</div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>      Lock_guard&lt;<span class="keyword">decltype</span>(m_peer_socket_mutex)&gt; peer_socket_lock(m_peer_socket_mutex);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span> </div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>      <span class="keywordflow">if</span> (m_peer_socket)</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>      {</div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>        m_rcv_ev_wait_func(&amp;m_ev_wait_hndl_peer_socket,</div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>                           <span class="keyword">false</span>, <span class="comment">// Wait for read.</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>                           <span class="comment">// Once writable do this:</span></div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>                           boost::make_shared&lt;Task&gt;([<span class="keyword">this</span>, n_rcvd]()</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>        {</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>          rcv_on_ev_peer_socket_readable_or_error(Rcv_msg_state::S_HEAD_PAYLOAD,</div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>                                                  <span class="keyword">sizeof</span>(m_rcv_target_meta_length) - n_rcvd);</div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>        }));</div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span> </div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>        *sync_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>;</div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>        *sync_sz = 0;</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>      }</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>      <span class="comment">// else:</span></div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>    } <span class="comment">// Lock_guard peer_socket_lock(m_peer_socket_mutex)</span></div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span> </div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User async-receive request: &quot;</span></div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>                     <span class="stringliteral">&quot;was about to await readability but discovered opposite-direction socket-hosing error; &quot;</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>                     <span class="stringliteral">&quot;emitting error via completion handler (or via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span> </div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>    m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1">error::Code::S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</a>;</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>  } <span class="comment">// if (no prob with hndl_or_null or m_target_hndl_ptr) (but another problem may have occurred inside)</span></div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span> </div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>  assert(m_rcv_pending_err_code);</div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span> </div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>  <span class="comment">// WARNINGs above are enough; no TRACE here.</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span> </div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span>  *sync_err_code = m_rcv_pending_err_code;</div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>  *sync_sz = 0;</div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>} <span class="comment">// Native_socket_stream::Impl::rcv_on_handle_finalized()</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span> </div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a3b6b76dfbddc562ece4f64742ff6d2c7">  440</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a3b6b76dfbddc562ece4f64742ff6d2c7">Native_socket_stream::Impl::rcv_on_head_payload</a>(<a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz)</div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>{</div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span> </div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>  assert(m_rcv_user_request);</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>  assert(!m_rcv_pending_err_code);</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span> </div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>  <span class="keywordtype">bool</span> proto_negotiating</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>    = m_protocol_negotiator.negotiated_proto_ver() == <a class="code hl_variable" href="classipc_1_1transport_1_1Protocol__negotiator.html#aa7e47f4f6a700aeaa9600a5426a17292">Protocol_negotiator::S_VER_UNKNOWN</a>;</div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span> </div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>  <span class="keywordflow">if</span> (proto_negotiating)</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>  {</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>    <span class="comment">/* Protocol_negotiator handles everything (invalid value, incompatible range...); we just know</span></div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span><span class="comment">     * the encoding is to shove the version number into what is normally the length field. */</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span><span class="preprocessor">#ifndef NDEBUG</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>    <span class="keyword">const</span> <span class="keywordtype">bool</span> ok =</div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>    m_protocol_negotiator.compute_negotiated_proto_ver</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>      (<span class="keyword">static_cast&lt;</span><a class="code hl_typedef" href="classipc_1_1transport_1_1Protocol__negotiator.html#a35fb3885d39f11d0c1f7860e64194592">Protocol_negotiator::proto_ver_t</a><span class="keyword">&gt;</span>(m_rcv_target_meta_length),</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>       &amp;m_rcv_pending_err_code);</div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>    assert(ok &amp;&amp; <span class="stringliteral">&quot;Protocol_negotiator breaking contract?  Bug?&quot;</span>);</div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>    proto_negotiating = <span class="keyword">false</span>; <span class="comment">// Just in case (maintainability).</span></div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span> </div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>    <span class="keywordflow">if</span> (m_rcv_pending_err_code)</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>    {</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>      <span class="comment">// Protocol negotiation failed.  Do what we&#39;d do due to, say, graceful-close below.</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>      *sync_err_code = m_rcv_pending_err_code;</div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>      *sync_sz = 0;</div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>    }</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>    <span class="comment">// else: Succeeded; do what we&#39;d do due to, say, receiving auto-ping below.</span></div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span> </div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Received all of negotiation payload; passed.  &quot;</span></div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>                   <span class="stringliteral">&quot;Ignoring other than registering non-idle activity.  Proceeding with the next message read.&quot;</span>);</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span> </div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>    rcv_not_idle(); <span class="comment">// Register activity &lt;= end of complete message, no error.</span></div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>    rcv_read_msg(sync_err_code, sync_sz);</div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno">  478</span>  }</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>  <span class="comment">// else if (!proto_negotiating): Normal payload 1 handling.</span></div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span> </div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>  <span class="keywordflow">if</span> (m_rcv_target_meta_length == S_META_BLOB_LENGTH_PING_SENTINEL)</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>  {</div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Received all of payload 1; length prefix &quot;</span></div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno">  484</span>                   <span class="stringliteral">&quot;contains special value indicating a ping.  Ignoring other than registering non-idle &quot;</span></div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>                   <span class="stringliteral">&quot;activity.  Proceeding with the next message read.&quot;</span>);</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span> </div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>    rcv_not_idle(); <span class="comment">// Register activity &lt;= end of complete message, no error.</span></div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>    rcv_read_msg(sync_err_code, sync_sz);</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>  }</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span> </div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span>  <span class="keyword">const</span> <span class="keyword">auto</span> user_target_size = m_rcv_user_request-&gt;m_target_meta_blob.size();</div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>  <span class="keywordflow">if</span> (m_rcv_target_meta_length != 0) <span class="comment">// &amp;&amp; (not ping)</span></div>
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno">  495</span>  {</div>
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno">  496</span>    <span class="keywordflow">if</span> (m_rcv_target_meta_length &lt;= user_target_size)</div>
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno">  497</span>    {</div>
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno">  498</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Received all of payload 1; length prefix &quot;</span></div>
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno">  499</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; m_rcv_target_meta_length &lt;&lt;<span class="stringliteral">&quot;] is positive (and not indicative of ping).  &quot;</span></div>
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno">  500</span>                     <span class="stringliteral">&quot;Reading payload 2.&quot;</span>);</div>
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno">  501</span>      rcv_read_blob(Rcv_msg_state::S_META_BLOB_PAYLOAD,</div>
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno">  502</span>                    <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(m_rcv_user_request-&gt;m_target_meta_blob.data(),</div>
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno">  503</span>                                 <span class="keywordtype">size_t</span>(m_rcv_target_meta_length)),</div>
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno">  504</span>                    sync_err_code, sync_sz);</div>
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno">  505</span>      <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno">  506</span>    }</div>
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno">  507</span>    <span class="comment">// else if (m_rcv_target_meta_length &gt; user_target_size):</span></div>
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno">  508</span> </div>
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno">  509</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Received all of payload 1; length prefix &quot;</span></div>
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno">  510</span>                     <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; m_rcv_target_meta_length &lt;&lt;<span class="stringliteral">&quot;] is positive (and not indicative of ping); &quot;</span></div>
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno">  511</span>                     <span class="stringliteral">&quot;however it exceeds user target blob size [&quot;</span> &lt;&lt; user_target_size &lt;&lt; <span class="stringliteral">&quot;] and would &quot;</span></div>
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno">  512</span>                     <span class="stringliteral">&quot;overflow.  Treating similarly to a graceful-close but with a bad error code and &quot;</span></div>
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno">  513</span>                     <span class="stringliteral">&quot;this warning.  Will not proceed with any further low-level receiving; will invoke &quot;</span></div>
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno">  514</span>                     <span class="stringliteral">&quot;handler (failure).&quot;</span>);</div>
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno">  515</span>    m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297adde24987f30a92b953297207ce935210">error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE</a>;</div>
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno">  516</span>  }</div>
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno">  517</span>  <span class="keywordflow">else</span> <span class="comment">// if (m_rcv_target_meta_length == 0)</span></div>
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno">  518</span>  {</div>
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno">  519</span>    <span class="keywordflow">if</span> (m_rcv_user_request-&gt;m_target_hndl_ptr &amp;&amp; (!m_rcv_user_request-&gt;m_target_hndl_ptr-&gt;null()))</div>
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno">  520</span>    {</div>
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno">  521</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Received all of payload 1; length 0 + non-null handle =&gt; &quot;</span></div>
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno">  522</span>                     <span class="stringliteral">&quot;handle received with no meta-blob.  Will register non-idle activity; &quot;</span></div>
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno">  523</span>                     <span class="stringliteral">&quot;and invoke handler (success).&quot;</span>);</div>
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno">  524</span>      <span class="comment">// m_rcv_pending_err_code remains falsy.</span></div>
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno">  525</span> </div>
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno">  526</span>      rcv_not_idle(); <span class="comment">// Register activity &lt;= end of complete message, no error.</span></div>
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno">  527</span>    }</div>
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno">  528</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno">  529</span>    {</div>
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno">  530</span>      <span class="comment">// Once per connection at most, so INFO log level is OK.</span></div>
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno">  531</span>      FLOW_LOG_INFO(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User message received: Graceful-close-of-incoming-pipe &quot;</span></div>
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno">  532</span>                    <span class="stringliteral">&quot;message.  Will not proceed with any further low-level receiving.  &quot;</span></div>
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno">  533</span>                    <span class="stringliteral">&quot;Will invoke handler (graceful-close error).&quot;</span>);</div>
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno">  534</span>      m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aad44f87d53255ba573d57086dfeab805">error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE</a>;</div>
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno">  535</span>    }</div>
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno">  536</span>  } <span class="comment">// else if (m_rcv_target_meta_length == 0)</span></div>
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno">  537</span> </div>
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno">  538</span>  *sync_err_code = m_rcv_pending_err_code; <span class="comment">// Truthy (graceful-close) or falsy (got handle + no meta-blob).</span></div>
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno">  539</span>  *sync_sz = 0;</div>
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno">  540</span>} <span class="comment">// Native_socket_stream::Impl::rcv_on_head_payload()</span></div>
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno">  541</span> </div>
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af324ad8945ab79d74e937e9c38c2fbb5">  542</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af324ad8945ab79d74e937e9c38c2fbb5">Native_socket_stream::Impl::rcv_on_ev_peer_socket_readable_or_error</a>(<a class="code hl_enumeration" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0e765fbfee2c76293b572b01c9be5680">Rcv_msg_state</a> msg_state, <span class="keywordtype">size_t</span> n_left)</div>
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno">  543</span>{</div>
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno">  544</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>;</div>
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno">  545</span> </div>
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno">  546</span>  <span class="keywordflow">if</span> (m_rcv_pending_err_code)</div>
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno">  547</span>  {</div>
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno">  548</span>    FLOW_LOG_WARNING(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User&#39;s wait-for-readable finished (readable or error, &quot;</span></div>
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno">  549</span>                     <span class="stringliteral">&quot;we do not know which yet); would resume processing depending on what we were doing before; &quot;</span></div>
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno">  550</span>                     <span class="stringliteral">&quot;however an error was detected in the meantime (as of this writing: idle timeout).  &quot;</span></div>
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno">  551</span>                     <span class="stringliteral">&quot;Stopping read chain.&quot;</span>);</div>
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno">  552</span>    assert((!m_rcv_user_request)</div>
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno">  553</span>           &amp;&amp; <span class="stringliteral">&quot;If rcv-error emitted during low-level async-wait, we should have fed it to any pending async-receive.&quot;</span>);</div>
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno">  554</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno">  555</span>  }</div>
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno">  556</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno">  557</span> </div>
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno">  558</span>  assert(m_rcv_user_request);</div>
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno">  559</span> </div>
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno">  560</span>  <span class="comment">// Will potentially emit these (if and only if message-read completes due to this successful async-wait).</span></div>
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno">  561</span>  <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a> sync_err_code;</div>
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno">  562</span>  <span class="keywordtype">size_t</span> sync_sz;</div>
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno">  563</span> </div>
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno">  564</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: User-performed wait-for-readable finished (readable or error, &quot;</span></div>
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno">  565</span>                 <span class="stringliteral">&quot;we do not know which yet).  Resuming processing depending on what we were doing before.&quot;</span>);</div>
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno">  566</span> </div>
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno">  567</span>  <span class="keywordflow">switch</span> (msg_state)</div>
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno">  568</span>  {</div>
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno">  569</span>  <span class="keywordflow">case</span> Rcv_msg_state::S_MSG_START:</div>
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno">  570</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: In state MSG_START: Reading from byte 0/handle if any.&quot;</span>);</div>
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno">  571</span>    rcv_read_msg(&amp;sync_err_code, &amp;sync_sz);</div>
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno">  572</span>    <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno">  573</span> </div>
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno">  574</span>  <span class="keywordflow">case</span> Rcv_msg_state::S_HEAD_PAYLOAD:</div>
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno">  575</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: In state HEAD_PAYLOAD: &quot;</span></div>
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno">  576</span>                   <span class="stringliteral">&quot;Reading meta-length/ping/graceful-close specifier: [&quot;</span> &lt;&lt; n_left &lt;&lt; <span class="stringliteral">&quot;] bytes left.&quot;</span>);</div>
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno">  577</span>    rcv_read_blob(Rcv_msg_state::S_HEAD_PAYLOAD,</div>
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno">  578</span>                  <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(<span class="keyword">static_cast&lt;</span>uint8_t*<span class="keyword">&gt;</span>(<span class="keyword">static_cast&lt;</span><span class="keywordtype">void</span>*<span class="keyword">&gt;</span>(&amp;m_rcv_target_meta_length))</div>
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno">  579</span>                                 + <span class="keyword">sizeof</span>(m_rcv_target_meta_length) - n_left,</div>
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno">  580</span>                               n_left),</div>
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno">  581</span>                  &amp;sync_err_code, &amp;sync_sz);</div>
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno">  582</span>    <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno">  583</span> </div>
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno">  584</span>  <span class="keywordflow">case</span> Rcv_msg_state::S_META_BLOB_PAYLOAD:</div>
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno">  585</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: In state META_BLOB_PAYLOAD: &quot;</span></div>
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno">  586</span>                   <span class="stringliteral">&quot;Reading meta-blob: [&quot;</span> &lt;&lt; n_left &lt;&lt; <span class="stringliteral">&quot;] bytes left.&quot;</span>);</div>
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno">  587</span>    rcv_read_blob(Rcv_msg_state::S_META_BLOB_PAYLOAD,</div>
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno">  588</span>                  <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">Blob_mutable</a>(<span class="keyword">static_cast&lt;</span>uint8_t*<span class="keyword">&gt;</span>(m_rcv_user_request-&gt;m_target_meta_blob.data())</div>
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno">  589</span>                                 + <span class="keywordtype">size_t</span>(m_rcv_target_meta_length) - n_left,</div>
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno">  590</span>                               n_left),</div>
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno">  591</span>                  &amp;sync_err_code, &amp;sync_sz);</div>
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno">  592</span>  } <span class="comment">// switch (msg_state) (Compiler should catch any missed enum value.)</span></div>
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno">  593</span> </div>
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno">  594</span>  <span class="keywordflow">if</span> (sync_err_code == <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>)</div>
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno">  595</span>  {</div>
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno">  596</span>    <span class="comment">// Another async-wait is pending now.  We&#39;ve logged enough.  Live to fight another day.</span></div>
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno">  597</span>    <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno">  598</span>  }</div>
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno">  599</span>  <span class="comment">// else</span></div>
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno">  600</span> </div>
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno">  601</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Async-op result ready after successful async-wait.  &quot;</span></div>
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno">  602</span>                 <span class="stringliteral">&quot;Executing handler now.&quot;</span>);</div>
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno">  603</span> </div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno">  604</span>  <span class="comment">// Prevent stepping on our own toes: move/clear it first / invoke handler second.</span></div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno">  605</span>  <span class="keyword">const</span> <span class="keyword">auto</span> on_done_func = std::move(m_rcv_user_request-&gt;m_on_done_func);</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno">  606</span>  m_rcv_user_request.reset();</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno">  607</span>  on_done_func(sync_err_code, sync_sz);</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno">  608</span>  FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Handler completed.&quot;</span>);</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno">  609</span>} <span class="comment">// Native_socket_stream::Impl::rcv_on_ev_peer_socket_readable_or_error()</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno">  610</span> </div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0ba676425c97ae496255a155f41943f8">  611</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0ba676425c97ae496255a155f41943f8">Native_socket_stream::Impl::rcv_read_blob</a>(<a class="code hl_enumeration" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0e765fbfee2c76293b572b01c9be5680">Rcv_msg_state</a> msg_state, <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>&amp; target_blob,</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno">  612</span>                                               <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* sync_err_code, <span class="keywordtype">size_t</span>* sync_sz)</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno">  613</span>{</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno">  614</span>  <span class="keyword">using </span><a class="code hl_typedef" href="namespaceipc_1_1util.html#a31e67d3a017477a04b313927e2f2c733">util::Task</a>;</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno">  615</span>  <span class="keyword">using </span>flow::util::Lock_guard;</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno">  616</span> </div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno">  617</span>  assert(!m_rcv_pending_err_code);</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno">  618</span>  assert(m_rcv_user_request);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno">  619</span> </div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno">  620</span>  <span class="keyword">const</span> <span class="keyword">auto</span> n_rcvd_or_zero = rcv_nb_read_low_lvl_payload(<span class="keyword">nullptr</span>, target_blob, &amp;m_rcv_pending_err_code);</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno">  621</span>  <span class="keywordflow">if</span> (!m_rcv_pending_err_code)</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno">  622</span>  {</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno">  623</span>    <span class="keywordflow">if</span> (n_rcvd_or_zero == target_blob.size())</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno">  624</span>    {</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno">  625</span>      <span class="keywordflow">switch</span> (msg_state)</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno">  626</span>      {</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno">  627</span>      <span class="keywordflow">case</span> Rcv_msg_state::S_HEAD_PAYLOAD:</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno">  628</span>        rcv_on_head_payload(sync_err_code, sync_sz);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno">  629</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno">  630</span>      <span class="keywordflow">case</span> Rcv_msg_state::S_META_BLOB_PAYLOAD:</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno">  631</span>      {</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno">  632</span>        FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Received all of payload 2 (meta-blob of length &quot;</span></div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno">  633</span>                       <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; m_rcv_target_meta_length &lt;&lt; <span class="stringliteral">&quot;]).  Will register non-idle activity; &quot;</span></div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno">  634</span>                       <span class="stringliteral">&quot;and invoke handler (or report via sync-args).&quot;</span>);</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno">  635</span> </div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno">  636</span>        rcv_not_idle(); <span class="comment">// Register activity &lt;= end of complete message, no error.</span></div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno">  637</span> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno">  638</span>        assert(!*sync_err_code);</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno">  639</span>        *sync_sz = size_t(m_rcv_target_meta_length);</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno">  640</span> </div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno">  641</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno">  642</span>      }</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno">  643</span>      <span class="keywordflow">case</span> Rcv_msg_state::S_MSG_START:</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno">  644</span>        assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;rcv_read_blob() shall be used only for S_*_PAYLOAD phases.&quot;</span>);</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno">  645</span>      }</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno">  646</span>      assert(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Should not get here.&quot;</span>);</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno">  647</span>    } <span class="comment">// if (n_rcvd_or_zero == target_blob.size())</span></div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno">  648</span>    <span class="comment">// else if (n_rcvd_or_zero != target_blob.size())</span></div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno">  649</span> </div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno">  650</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Do not have all of requested payload; got would-block.  Awaiting readability.&quot;</span>);</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno">  651</span> </div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno">  652</span>    <span class="comment">// So, much like in rcv_read_msg() (keeping comments light): */</span></div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno">  653</span>    {</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno">  654</span>      Lock_guard&lt;<span class="keyword">decltype</span>(m_peer_socket_mutex)&gt; peer_socket_lock(m_peer_socket_mutex);</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno">  655</span> </div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno">  656</span>      <span class="keywordflow">if</span> (m_peer_socket)</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno">  657</span>      {</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno">  658</span>        m_rcv_ev_wait_func(&amp;m_ev_wait_hndl_peer_socket,</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno">  659</span>                           <span class="keyword">false</span>, <span class="comment">// Wait for read.</span></div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno">  660</span>                           <span class="comment">// Once writable do this:</span></div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno">  661</span>                           boost::make_shared&lt;Task&gt;([<span class="keyword">this</span>, msg_state,</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno">  662</span>                                                     n_left = target_blob.size() - n_rcvd_or_zero]()</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno">  663</span>        {</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno">  664</span>          rcv_on_ev_peer_socket_readable_or_error(msg_state, n_left);</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno">  665</span>        }));</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno">  666</span> </div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno">  667</span>        *sync_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">error::Code::S_SYNC_IO_WOULD_BLOCK</a>;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno">  668</span>        *sync_sz = 0;</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno">  669</span>        <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno">  670</span>      }</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno">  671</span>      <span class="comment">// else:</span></div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno">  672</span>    } <span class="comment">// Lock_guard peer_socket_lock(m_peer_socket_mutex)</span></div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno">  673</span> </div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno">  674</span>    m_rcv_pending_err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1">error::Code::S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</a>;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno">  675</span>  } <span class="comment">// if (!m_rcv_pending_err_code) (but may have become truthy inside, and has unless we `return`ed inside)</span></div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno">  676</span> </div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno">  677</span>  assert(m_rcv_pending_err_code);</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno">  678</span> </div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno">  679</span>  *sync_err_code = m_rcv_pending_err_code;</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno">  680</span>  *sync_sz = 0;</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno">  681</span>} <span class="comment">// Native_socket_stream::Impl::rcv_read_blob()</span></div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno">  682</span> </div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a25e051170a8eb568745f809bb186f980">  683</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a25e051170a8eb568745f809bb186f980">Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload</a>(<a class="code hl_struct" href="structipc_1_1util_1_1Native__handle.html">Native_handle</a>* target_payload_hndl_or_null,</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno">  684</span>                                                               <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">util::Blob_mutable</a>&amp; target_payload_blob,</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno">  685</span>                                                               <a class="code hl_typedef" href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">Error_code</a>* err_code)</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno">  686</span>{</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno">  687</span>  <span class="keyword">using </span>flow::util::Lock_guard;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno">  688</span>  <span class="keyword">using </span><a class="code hl_function" href="namespaceipc_1_1transport_1_1asio__local__stream__socket.html#a9ae82b2a234b218704c62fb616d6fcc5">asio_local_stream_socket::nb_read_some_with_native_handle</a>;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno">  689</span> </div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno">  690</span>  assert(err_code);</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno">  691</span> </div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno">  692</span>  <span class="comment">// We comment liberally, but tactically, inline; but please read the strategy in the class doc header&#39;s impl section.</span></div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno">  693</span> </div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno">  694</span>  <span class="comment">/* Result semantics (reminder of what we promised in contract):</span></div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno">  695</span><span class="comment">   *   Partial or total success in non-blockingly receiving blob and handle-or-none: &gt; 0; falsy *err_code.</span></div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno">  696</span><span class="comment">   *   No success in receiving blob+handle, because it would-block (not fatal): == 0; falsy *err_code.</span></div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno">  697</span><span class="comment">   *   No success in receiving blob+handle, because fatal error: == 0, truthy *err_code. */</span></div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno">  698</span>  <span class="keywordtype">size_t</span> n_rcvd_or_zero = 0;</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno">  699</span> </div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno">  700</span>  <span class="comment">// m_*peer_socket = (the only) shared data between our- and opposite-direction code.  Must lock (see class docs).</span></div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno">  701</span>  {</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno">  702</span>    Lock_guard&lt;<span class="keyword">decltype</span>(m_peer_socket_mutex)&gt; peer_socket_lock(m_peer_socket_mutex);</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno">  703</span> </div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno">  704</span>    <span class="keywordflow">if</span> (m_peer_socket)</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno">  705</span>    {</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno">  706</span>      <span class="keywordflow">if</span> (target_payload_hndl_or_null)</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno">  707</span>      {</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno">  708</span>        <span class="comment">/* Per contract, nb_read_some_with_native_handle() is identical to setting non_blocking(true) and attempting</span></div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno">  709</span><span class="comment">         * read_some(orig_blob) -- except if it&#39;s able to receive even 1 byte it&#39;ll also have set the target handle</span></div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno">  710</span><span class="comment">         * to either null (none present) or non-null.</span></div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno">  711</span><span class="comment">         * When we say identical we mean identical result semantics along with everything else. */</span></div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno">  712</span>        n_rcvd_or_zero = <a class="code hl_function" href="namespaceipc_1_1transport_1_1asio__local__stream__socket.html#a9ae82b2a234b218704c62fb616d6fcc5">nb_read_some_with_native_handle</a>(<a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#aac68d14f4ef33505399df4fd04cd4669">get_logger</a>(), m_peer_socket.get(),</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno">  713</span>                                                         target_payload_hndl_or_null, target_payload_blob, err_code);</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno">  714</span>        <span class="comment">// That should have TRACE-logged stuff, so we won&#39;t (it&#39;s our function).</span></div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno">  715</span>      } <span class="comment">// if (target_payload_hndl_or_null)</span></div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno">  716</span>      <span class="keywordflow">else</span> <span class="comment">// if (!target_payload_hndl_or_null)</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno">  717</span>      {</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno">  718</span>        <span class="comment">/* No interest in receiving a handle, so we can just use boost.asio&#39;s normal non-blocking read</span></div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno">  719</span><span class="comment">         * (non_blocking(true), read_some()). */</span></div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno">  720</span> </div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno">  721</span>        <span class="comment">// First set non-blocking mode... same deal as in snd_nb_write_low_lvl_payload(); keeping comments light.</span></div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno">  722</span>        <span class="keywordflow">if</span> (!m_peer_socket-&gt;non_blocking())</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno">  723</span>        {</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno">  724</span>          FLOW_LOG_TRACE(<span class="stringliteral">&quot;Socket stream [&quot;</span> &lt;&lt; *<span class="keyword">this</span> &lt;&lt; <span class="stringliteral">&quot;]: Setting boost.asio peer socket non-blocking mode.&quot;</span>);</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno">  725</span>          m_peer_socket-&gt;non_blocking(<span class="keyword">true</span>, *err_code); <span class="comment">// Sets *err_code to success or the triggering error.</span></div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno">  726</span>        }</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno">  727</span>        <span class="keywordflow">else</span> <span class="comment">// if (already non-blocking)</span></div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno">  728</span>        {</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno">  729</span>          err_code-&gt;clear();</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno">  730</span>        }</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno">  731</span> </div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno">  732</span>        <span class="keywordflow">if</span> (!*err_code)</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno">  733</span>        {</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno">  734</span>          assert(m_peer_socket-&gt;non_blocking());</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno">  735</span> </div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno">  736</span>          FLOW_LOG_TRACE(<span class="stringliteral">&quot;Reading low-level blob directly via boost.asio (blob details logged above hopefully).&quot;</span>);</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno">  737</span>          n_rcvd_or_zero = m_peer_socket-&gt;read_some(target_payload_blob, *err_code);</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno">  738</span>        }</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno">  739</span>        <span class="comment">// else if (*err_code) { *err_code is truthy; n_rcvd_or_zero == 0; cool. }</span></div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno">  740</span>      }</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno">  741</span> </div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno">  742</span>      <span class="comment">/* Almost home free; but our result semantics are a little different from the low-level-read functions&#39;.</span></div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno">  743</span><span class="comment">       *</span></div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno">  744</span><span class="comment">       * Plus, if we just discovered the connection is hosed, do whatever&#39;s needed with that. */</span></div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno">  745</span>      assert(((!*err_code) &amp;&amp; (n_rcvd_or_zero != 0))</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno">  746</span>             || (*err_code &amp;&amp; (n_rcvd_or_zero == 0)));</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno">  747</span>      <span class="keywordflow">if</span> (*err_code == boost::asio::error::would_block)</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno">  748</span>      {</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno">  749</span>        err_code-&gt;clear();</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno">  750</span>        <span class="comment">// *err_code is falsy; n_rcvd_or_zero == 0; cool.</span></div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno">  751</span>      }</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno">  752</span>      <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno">  753</span>      {</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno">  754</span>        <span class="comment">/* True-blue system error.  Kill off *m_peer_socket (connection hosed).  We could simply nullify it, which would</span></div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno">  755</span><span class="comment">         * give it back to the system (it&#39;s a resource), but see m_peer_socket_hosed doc header for explanation as</span></div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno">  756</span><span class="comment">         * to why we cannot, and why instead we transfer it to &quot;death row&quot; until dtor executes, at which</span></div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno">  757</span><span class="comment">         * point ::close(m_peer_socket_hosed-&gt;native_handle()) will actually happen. */</span></div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno">  758</span> </div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno">  759</span>        assert((!m_peer_socket_hosed) &amp;&amp; <span class="stringliteral">&quot;m_peer_socket_hosed must start as null and only become non-null once.  Bug?&quot;</span>);</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno">  760</span>        m_peer_socket_hosed = std::move(m_peer_socket);</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno">  761</span>        assert((!m_peer_socket) &amp;&amp; <span class="stringliteral">&quot;Shocking unique_ptr misbehavior!&quot;</span>);</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno">  762</span> </div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno">  763</span>        <span class="comment">// *err_code is truthy; n_rcvd_or_zero == 0; cool.</span></div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno">  764</span>      }</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno">  765</span>      <span class="comment">// else if (!*err_code) { *err_code is falsy; n_rcvd_or_zero &gt;= 1; cool. }</span></div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno">  766</span>    } <span class="comment">// if (m_peer_socket)</span></div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno">  767</span>    <span class="keywordflow">else</span> <span class="comment">// if (!m_peer_socket)</span></div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno">  768</span>    {</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno">  769</span>      *err_code = <a class="code hl_enumvalue" href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1">error::Code::S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</a>;</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno">  770</span>    }</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno">  771</span>  } <span class="comment">// Lock_guard peer_socket_lock(m_peer_socket_mutex)</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno">  772</span> </div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno">  773</span>  assert((!*err_code)</div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno">  774</span>         || (n_rcvd_or_zero == 0)); <span class="comment">// &amp;&amp; *err_code</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno">  775</span> </div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno">  776</span>  <span class="keywordflow">if</span> (*err_code)</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno">  777</span>  {</div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno">  778</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Received nothing due to error [&quot;</span> &lt;&lt; *err_code &lt;&lt; <span class="stringliteral">&quot;] [&quot;</span> &lt;&lt; err_code-&gt;message() &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno">  779</span>  }</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno">  780</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno">  781</span>  {</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno">  782</span>    FLOW_LOG_TRACE(<span class="stringliteral">&quot;Receive: no error.  Was able to receive [&quot;</span> &lt;&lt; n_rcvd_or_zero &lt;&lt; <span class="stringliteral">&quot;] of &quot;</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno">  783</span>                   <span class="stringliteral">&quot;[&quot;</span> &lt;&lt; target_payload_blob.size() &lt;&lt; <span class="stringliteral">&quot;] bytes.&quot;</span>);</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno">  784</span>    <span class="keywordflow">if</span> (target_payload_hndl_or_null)</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno">  785</span>    {</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno">  786</span>      <span class="keywordflow">if</span> (n_rcvd_or_zero != 0)</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno">  787</span>      {</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno">  788</span>        FLOW_LOG_TRACE(<span class="stringliteral">&quot;Interest in native handle; was able to establish its presence or absence; &quot;</span></div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno">  789</span>                       <span class="stringliteral">&quot;present? = [&quot;</span> &lt;&lt; (!target_payload_hndl_or_null-&gt;<a class="code hl_function" href="structipc_1_1util_1_1Native__handle.html#a11bd62ce0a7bef4bdfe666201c26d4dc">null</a>()) &lt;&lt; <span class="stringliteral">&quot;].&quot;</span>);</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno">  790</span>      }</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno">  791</span>    } <span class="comment">// if (target_payload_hndl_or_null)</span></div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno">  792</span>    <span class="keywordflow">else</span></div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno">  793</span>    {</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno">  794</span>      FLOW_LOG_TRACE(<span class="stringliteral">&quot;No interest in native handle.&quot;</span>);</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno">  795</span>    }</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno">  796</span>  } <span class="comment">// else if (!*err_code)</span></div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno">  797</span> </div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno">  798</span>  <span class="keywordflow">return</span> n_rcvd_or_zero;</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno">  799</span>} <span class="comment">// Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload()</span></div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno">  800</span> </div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af5d6e9275386dfefddb7a97248b039a7">  801</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af5d6e9275386dfefddb7a97248b039a7">Native_socket_stream::Impl::receive_meta_blob_max_size</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno">  802</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno">  803</span>  <span class="keywordflow">return</span> state_peer(<span class="stringliteral">&quot;receive_meta_blob_max_size()&quot;</span>) ? <a class="code hl_variable" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#a00624e2fc3757012d13e3dc0feb26a21">S_MAX_META_BLOB_LENGTH</a> : 0;</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno">  804</span>}</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno">  805</span> </div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"><a class="line" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ace12ebbb258f933e517255294f372795">  806</a></span><span class="keywordtype">size_t</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ace12ebbb258f933e517255294f372795">Native_socket_stream::Impl::receive_blob_max_size</a>()<span class="keyword"> const</span></div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno">  807</span><span class="keyword"></span>{</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno">  808</span>  <span class="keywordflow">return</span> <a class="code hl_function" href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#acc5f3cae4c5ff2facb5795c5013374e6">receive_meta_blob_max_size</a>();</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno">  809</span>}</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno">  810</span> </div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno">  811</span>} <span class="comment">// namespace ipc::transport::sync_io</span></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Protocol__negotiator_html_a35fb3885d39f11d0c1f7860e64194592"><div class="ttname"><a href="classipc_1_1transport_1_1Protocol__negotiator.html#a35fb3885d39f11d0c1f7860e64194592">ipc::transport::Protocol_negotiator::proto_ver_t</a></div><div class="ttdeci">int16_t proto_ver_t</div><div class="ttdoc">Type sufficient to store a protocol version; positive values identify newer versions of a protocol; w...</div><div class="ttdef"><b>Definition:</b> <a href="protocol__negotiator_8hpp_source.html#l00199">protocol_negotiator.hpp:199</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1Protocol__negotiator_html_aa7e47f4f6a700aeaa9600a5426a17292"><div class="ttname"><a href="classipc_1_1transport_1_1Protocol__negotiator.html#aa7e47f4f6a700aeaa9600a5426a17292">ipc::transport::Protocol_negotiator::S_VER_UNKNOWN</a></div><div class="ttdeci">static constexpr proto_ver_t S_VER_UNKNOWN</div><div class="ttdoc">A proto_ver_t value, namely a negative one, which is a reserved value indicating &quot;unknown version&quot;; i...</div><div class="ttdef"><b>Definition:</b> <a href="protocol__negotiator_8hpp_source.html#l00215">protocol_negotiator.hpp:215</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a0ba676425c97ae496255a155f41943f8"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0ba676425c97ae496255a155f41943f8">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_read_blob</a></div><div class="ttdeci">void rcv_read_blob(Rcv_msg_state msg_state, const util::Blob_mutable &amp;target_blob, Error_code *sync_err_code, size_t *sync_sz)</div><div class="ttdoc">A somewhat-general utility that continues read chain with the aim to complete the present in-message,...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00611">native_socket_stream_impl_rcv.cpp:611</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a0e765fbfee2c76293b572b01c9be5680"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a0e765fbfee2c76293b572b01c9be5680">ipc::transport::sync_io::Native_socket_stream::Impl::Rcv_msg_state</a></div><div class="ttdeci">Rcv_msg_state</div><div class="ttdoc">Used to organize tje incoming-direction state machine tactically, this indicates what part of payload...</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2detail_2native__socket__stream__impl_8hpp_source.html#l00650">native_socket_stream_impl.hpp:651</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a12e99a2479fbf08b2fa32a2f17ed1ca7"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a12e99a2479fbf08b2fa32a2f17ed1ca7">ipc::transport::sync_io::Native_socket_stream::Impl::start_receive_blob_ops</a></div><div class="ttdeci">bool start_receive_blob_ops(util::sync_io::Event_wait_func &amp;&amp;ev_wait_func)</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00032">native_socket_stream_impl_rcv.cpp:32</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a25e051170a8eb568745f809bb186f980"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a25e051170a8eb568745f809bb186f980">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_nb_read_low_lvl_payload</a></div><div class="ttdeci">size_t rcv_nb_read_low_lvl_payload(Native_handle *target_payload_hndl_or_null, const util::Blob_mutable &amp;target_payload_blob, Error_code *err_code)</div><div class="ttdoc">Utility that synchronously, non-blockingly attempts to read over m_peer_socket into the target blob a...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00683">native_socket_stream_impl_rcv.cpp:683</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a3b6b76dfbddc562ece4f64742ff6d2c7"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a3b6b76dfbddc562ece4f64742ff6d2c7">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_head_payload</a></div><div class="ttdeci">void rcv_on_head_payload(Error_code *sync_err_code, size_t *sync_sz)</div><div class="ttdoc">Reacts to payload 1 having been completely received.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00440">native_socket_stream_impl_rcv.cpp:440</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a4a94088b9f00288ae7e2cf3c7b49c444"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4a94088b9f00288ae7e2cf3c7b49c444">ipc::transport::sync_io::Native_socket_stream::Impl::start_receive_native_handle_ops</a></div><div class="ttdeci">bool start_receive_native_handle_ops(util::sync_io::Event_wait_func &amp;&amp;ev_wait_func)</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00027">native_socket_stream_impl_rcv.cpp:27</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a4c3d1ba7c70649898a7893daf076c7ae"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a4c3d1ba7c70649898a7893daf076c7ae">ipc::transport::sync_io::Native_socket_stream::Impl::async_receive_blob</a></div><div class="ttdeci">bool async_receive_blob(const util::Blob_mutable &amp;target_blob, Error_code *sync_err_code, size_t *sync_sz, flow::async::Task_asio_err_sz &amp;&amp;on_done_func)</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00054">native_socket_stream_impl_rcv.cpp:54</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_a53b356e756923271fbb9b7a7beb8f54a"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#a53b356e756923271fbb9b7a7beb8f54a">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_ev_idle_timer_fired</a></div><div class="ttdeci">void rcv_on_ev_idle_timer_fired()</div><div class="ttdoc">Handler for the async-wait, via util::sync_io::Timer_event_emitter, of the idle timer firing; if stil...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00210">native_socket_stream_impl_rcv.cpp:210</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_aa342b6f0c7e2015517a5c465e4963fc7"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa342b6f0c7e2015517a5c465e4963fc7">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_handle_finalized</a></div><div class="ttdeci">void rcv_on_handle_finalized(Native_handle hndl_or_null, size_t n_rcvd, Error_code *sync_err_code, size_t *sync_sz)</div><div class="ttdoc">Helper of rcv_read_msg() – it could have been inlined instead of a method but for readability concern...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00348">native_socket_stream_impl_rcv.cpp:348</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_aa3b06f1d59f5635c81a99e4ae8f7b8c7"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa3b06f1d59f5635c81a99e4ae8f7b8c7">ipc::transport::sync_io::Native_socket_stream::Impl::async_receive_native_handle</a></div><div class="ttdeci">bool async_receive_native_handle(Native_handle *target_hndl, const util::Blob_mutable &amp;target_meta_blob, Error_code *sync_err_code, size_t *sync_sz, flow::async::Task_asio_err_sz &amp;&amp;on_done_func)</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00037">native_socket_stream_impl_rcv.cpp:37</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_aa8c4ec6715dc5c437ed285cfea600b46"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#aa8c4ec6715dc5c437ed285cfea600b46">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_read_msg</a></div><div class="ttdeci">void rcv_read_msg(Error_code *sync_err_code, size_t *sync_sz)</div><div class="ttdoc">Begins read chain (completing it as synchronously as possible, async-completing the rest) for the nex...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00279">native_socket_stream_impl_rcv.cpp:279</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_abedd0db5a5ae04e47085728ae548d07c"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#abedd0db5a5ae04e47085728ae548d07c">ipc::transport::sync_io::Native_socket_stream::Impl::idle_timer_run</a></div><div class="ttdeci">bool idle_timer_run(util::Fine_duration timeout)</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00154">native_socket_stream_impl_rcv.cpp:154</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_ace12ebbb258f933e517255294f372795"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ace12ebbb258f933e517255294f372795">ipc::transport::sync_io::Native_socket_stream::Impl::receive_blob_max_size</a></div><div class="ttdeci">size_t receive_blob_max_size() const</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00806">native_socket_stream_impl_rcv.cpp:806</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_adff873e21beee6c31a552293d8b0004c"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#adff873e21beee6c31a552293d8b0004c">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_not_idle</a></div><div class="ttdeci">void rcv_not_idle()</div><div class="ttdoc">No-ops if idle_timer_run() is not engaged; otherwise reacts to non-idleness of the in-pipe by resched...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00244">native_socket_stream_impl_rcv.cpp:244</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_ae16d560bf3c4eccfa975d47af71cb145"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#ae16d560bf3c4eccfa975d47af71cb145">ipc::transport::sync_io::Native_socket_stream::Impl::async_receive_native_handle_impl</a></div><div class="ttdeci">bool async_receive_native_handle_impl(Native_handle *target_hndl_or_null, const util::Blob_mutable &amp;target_meta_blob, Error_code *sync_err_code, size_t *sync_sz, flow::async::Task_asio_err_sz &amp;&amp;on_done_func)</div><div class="ttdoc">Body of both async_receive_native_handle() and async_receive_blob().</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00061">native_socket_stream_impl_rcv.cpp:61</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_af324ad8945ab79d74e937e9c38c2fbb5"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af324ad8945ab79d74e937e9c38c2fbb5">ipc::transport::sync_io::Native_socket_stream::Impl::rcv_on_ev_peer_socket_readable_or_error</a></div><div class="ttdeci">void rcv_on_ev_peer_socket_readable_or_error(Rcv_msg_state msg_state, size_t n_left)</div><div class="ttdoc">Completion handler, from outside event loop via sync_io pattern, for the async-wait initiated by vari...</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00542">native_socket_stream_impl_rcv.cpp:542</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl_html_af5d6e9275386dfefddb7a97248b039a7"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream_1_1Impl.html#af5d6e9275386dfefddb7a97248b039a7">ipc::transport::sync_io::Native_socket_stream::Impl::receive_meta_blob_max_size</a></div><div class="ttdeci">size_t receive_meta_blob_max_size() const</div><div class="ttdoc">See Native_socket_stream counterpart.</div><div class="ttdef"><b>Definition:</b> <a href="native__socket__stream__impl__rcv_8cpp_source.html#l00801">native_socket_stream_impl_rcv.cpp:801</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_html_a00624e2fc3757012d13e3dc0feb26a21"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#a00624e2fc3757012d13e3dc0feb26a21">ipc::transport::sync_io::Native_socket_stream::S_MAX_META_BLOB_LENGTH</a></div><div class="ttdeci">static const size_t &amp; S_MAX_META_BLOB_LENGTH</div><div class="ttdoc">The maximum length of a blob that can be sent by this protocol.</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2native__socket__stream_8hpp_source.html#l00197">native_socket_stream.hpp:197</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_html_a7034a92ae66759080c035b36ff851e0c"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#a7034a92ae66759080c035b36ff851e0c">ipc::transport::sync_io::Native_socket_stream::S_BLOB_UNDERFLOW_ALLOWED</a></div><div class="ttdeci">static constexpr bool S_BLOB_UNDERFLOW_ALLOWED</div><div class="ttdoc">Implements concept API; namely it is true.</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2native__socket__stream_8hpp_source.html#l00179">native_socket_stream.hpp:179</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_html_aac68d14f4ef33505399df4fd04cd4669"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#aac68d14f4ef33505399df4fd04cd4669">ipc::transport::sync_io::Native_socket_stream::get_logger</a></div><div class="ttdeci">flow::log::Logger * get_logger() const</div><div class="ttdoc">Returns logger (possibly null).</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2native__socket__stream_8cpp_source.html#l00148">native_socket_stream.cpp:148</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_html_ac6d65bc2852ad8800cb57a23311fbe7e"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#ac6d65bc2852ad8800cb57a23311fbe7e">ipc::transport::sync_io::Native_socket_stream::start_receive_native_handle_ops</a></div><div class="ttdeci">bool start_receive_native_handle_ops(Event_wait_func_t &amp;&amp;ev_wait_func)</div><div class="ttdoc">Implements Native_handle_receiver API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2native__socket__stream_8hpp_source.html#l00807">native_socket_stream.hpp:807</a></div></div>
<div class="ttc" id="aclassipc_1_1transport_1_1sync__io_1_1Native__socket__stream_html_acc5f3cae4c5ff2facb5795c5013374e6"><div class="ttname"><a href="classipc_1_1transport_1_1sync__io_1_1Native__socket__stream.html#acc5f3cae4c5ff2facb5795c5013374e6">ipc::transport::sync_io::Native_socket_stream::receive_meta_blob_max_size</a></div><div class="ttdeci">size_t receive_meta_blob_max_size() const</div><div class="ttdoc">Implements Native_handle_receiver API per contract.</div><div class="ttdef"><b>Definition:</b> <a href="sync__io_2native__socket__stream_8cpp_source.html#l00133">native_socket_stream.cpp:133</a></div></div>
<div class="ttc" id="aipc__core_2src_2ipc_2transport_2error_8hpp_html"><div class="ttname"><a href="ipc__core_2src_2ipc_2transport_2error_8hpp.html">error.hpp</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1asio__local__stream__socket_html_a9ae82b2a234b218704c62fb616d6fcc5"><div class="ttname"><a href="namespaceipc_1_1transport_1_1asio__local__stream__socket.html#a9ae82b2a234b218704c62fb616d6fcc5">ipc::transport::asio_local_stream_socket::nb_read_some_with_native_handle</a></div><div class="ttdeci">size_t nb_read_some_with_native_handle(flow::log::Logger *logger_ptr, Peer_socket *peer_socket_ptr, Native_handle *target_payload_hndl_ptr, const util::Blob_mutable &amp;target_payload_blob, Error_code *err_code, int message_flags)</div><div class="ttdoc">boost.asio extension similar to peer_socket-&gt;non_blocking(true); auto n = peer_socket-&gt;read_some(targ...</div><div class="ttdef"><b>Definition:</b> <a href="asio__local__stream__socket_8cpp_source.html#l00201">asio_local_stream_socket.cpp:201</a></div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297a1fba28e335d4189cbb25f382582efcc1">ipc::transport::error::Code::S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</a></div><div class="ttdeci">@ S_LOW_LVL_TRANSPORT_HOSED_CANNOT_RECEIVE</div><div class="ttdoc">Unable to receive incoming traffic: an earlier-reported, or at least logged, system error had hosed t...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aa667487757f9d6300f6888bac40bcc24">ipc::transport::error::Code::S_SYNC_IO_WOULD_BLOCK</a></div><div class="ttdeci">@ S_SYNC_IO_WOULD_BLOCK</div><div class="ttdoc">A sync_io operation could not immediately complete; it will complete contingent on active async-wait ...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297aad44f87d53255ba573d57086dfeab805"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aad44f87d53255ba573d57086dfeab805">ipc::transport::error::Code::S_RECEIVES_FINISHED_CANNOT_RECEIVE</a></div><div class="ttdeci">@ S_RECEIVES_FINISHED_CANNOT_RECEIVE</div><div class="ttdoc">Will not receive message: either opposing user sent graceful-close via API.</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297aba920b52e9801e4927dd346ad83ce815"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297aba920b52e9801e4927dd346ad83ce815">ipc::transport::error::Code::S_RECEIVER_IDLE_TIMEOUT</a></div><div class="ttdeci">@ S_RECEIVER_IDLE_TIMEOUT</div><div class="ttdoc">No messages (optional auto-pings or otherwise) have been received; optionally configured timeout exce...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297adde24987f30a92b953297207ce935210"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297adde24987f30a92b953297207ce935210">ipc::transport::error::Code::S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE</a></div><div class="ttdeci">@ S_MESSAGE_SIZE_EXCEEDS_USER_STORAGE</div><div class="ttdoc">User protocol-code mismatch: local user-provided storage cannot fit entire message received from oppo...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1error_html_adfef15ef4e76cc55d652fbd9c2797297ae3753569086cc66c6165480bd8d2f937"><div class="ttname"><a href="namespaceipc_1_1transport_1_1error.html#adfef15ef4e76cc55d652fbd9c2797297ae3753569086cc66c6165480bd8d2f937">ipc::transport::error::Code::S_BLOB_RECEIVER_GOT_NON_BLOB</a></div><div class="ttdeci">@ S_BLOB_RECEIVER_GOT_NON_BLOB</div><div class="ttdoc">User protocol-code mismatch: local user expected blob only and no native handle; received at least th...</div></div>
<div class="ttc" id="anamespaceipc_1_1transport_1_1sync__io_html"><div class="ttname"><a href="namespaceipc_1_1transport_1_1sync__io.html">ipc::transport::sync_io</a></div><div class="ttdoc">sync_io-pattern counterparts to async-I/O-pattern object types in parent namespace ipc::transport.</div><div class="ttdef"><b>Definition:</b> <a href="detail_2transport__fwd_8hpp_source.html#l00069">transport_fwd.hpp:70</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_1_1sync__io_html_aa0b9a3cc6bdc7dedbef4f9e06851aa24"><div class="ttname"><a href="namespaceipc_1_1util_1_1sync__io.html#aa0b9a3cc6bdc7dedbef4f9e06851aa24">ipc::util::sync_io::Event_wait_func</a></div><div class="ttdeci">Function&lt; void(Asio_waitable_native_handle *hndl_of_interest, bool ev_of_interest_snd_else_rcv, Task_ptr &amp;&amp;on_active_ev_func)&gt; Event_wait_func</div><div class="ttdoc">In sync_io pattern, concrete type storing user-supplied function invoked by pattern-implementing ipc:...</div><div class="ttdef"><b>Definition:</b> <a href="sync__io__fwd_8hpp_source.html#l00817">sync_io_fwd.hpp:819</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a31e67d3a017477a04b313927e2f2c733"><div class="ttname"><a href="namespaceipc_1_1util.html#a31e67d3a017477a04b313927e2f2c733">ipc::util::Task</a></div><div class="ttdeci">flow::async::Task Task</div><div class="ttdoc">Short-hand for polymorphic function (a-la std::function&lt;&gt;) that takes no arguments and returns nothin...</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00122">util_fwd.hpp:122</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_a6cb62ae434900f3a8915b33ec5d61a96"><div class="ttname"><a href="namespaceipc_1_1util.html#a6cb62ae434900f3a8915b33ec5d61a96">ipc::util::Blob_mutable</a></div><div class="ttdeci">boost::asio::mutable_buffer Blob_mutable</div><div class="ttdoc">Short-hand for an mutable blob somewhere in memory, stored as exactly a void* and a size_t.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00140">util_fwd.hpp:140</a></div></div>
<div class="ttc" id="anamespaceipc_1_1util_html_ac66141280c3b7295a86b65209f31cc58"><div class="ttname"><a href="namespaceipc_1_1util.html#ac66141280c3b7295a86b65209f31cc58">ipc::util::Fine_duration</a></div><div class="ttdeci">flow::Fine_duration Fine_duration</div><div class="ttdoc">Short-hand for Flow's Fine_duration.</div><div class="ttdef"><b>Definition:</b> <a href="util__fwd_8hpp_source.html#l00117">util_fwd.hpp:117</a></div></div>
<div class="ttc" id="anamespaceipc_html_aa3192e586cc45d3e7c22463bf2760f89"><div class="ttname"><a href="namespaceipc.html#aa3192e586cc45d3e7c22463bf2760f89">ipc::Error_code</a></div><div class="ttdeci">flow::Error_code Error_code</div><div class="ttdoc">Short-hand for flow::Error_code which is very common.</div><div class="ttdef"><b>Definition:</b> <a href="common_8hpp_source.html#l00298">common.hpp:298</a></div></div>
<div class="ttc" id="astructipc_1_1util_1_1Native__handle_html"><div class="ttname"><a href="structipc_1_1util_1_1Native__handle.html">ipc::util::Native_handle</a></div><div class="ttdoc">A monolayer-thin wrapper around a native handle, a/k/a descriptor a/k/a FD.</div><div class="ttdef"><b>Definition:</b> <a href="native__handle_8hpp_source.html#l00062">native_handle.hpp:63</a></div></div>
<div class="ttc" id="astructipc_1_1util_1_1Native__handle_html_a11bd62ce0a7bef4bdfe666201c26d4dc"><div class="ttname"><a href="structipc_1_1util_1_1Native__handle.html#a11bd62ce0a7bef4bdfe666201c26d4dc">ipc::util::Native_handle::null</a></div><div class="ttdeci">bool null() const</div><div class="ttdoc">Returns true if and only if m_native_handle equals S_NULL_HANDLE.</div><div class="ttdef"><b>Definition:</b> <a href="native__handle_8cpp_source.html#l00061">native_handle.cpp:61</a></div></div>
<div class="ttc" id="async__io_2detail_2native__socket__stream__impl_8hpp_html"><div class="ttname"><a href="sync__io_2detail_2native__socket__stream__impl_8hpp.html">native_socket_stream_impl.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Apr 11 2025 20:02:26 for Flow-IPC by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
